package com.lambda;

public class Main {

    public static void main(String[] args) {
        DeviceA a = new DeviceA();
        DeviceB b = new DeviceB();
//
        a.setActivated(true);

        System.out.println(a.isActivated());
        System.out.println(b.isActivated());


        X x1 = makeX();
        X x2 = makeX();
        x2.setName("x2");
        x1.setName("x1");

        /**
         * 在编译时，lambda 表达式并没有经过完整的翻译，事实上这个翻译过程是在编译和运行时完成的，
         * javac 编译器将 lambda 表达式变成 JVM 新增的指令 invokedynamic (JSR292)。
         * 这个指令包含所有必须的关于在运行时执行 lambda 表达式的元信息。包括要调用的方法名、
         * 输入输出类型以及一个名为 bootstrap 的方法。
         * bootstrap 方法用于定义接收此方法调用的实例，一旦 JVM 执行了 invokedynamic 指令，
         * JVM 就会在特定的 bootstrap 上调用 lambda 元工厂方法 (lambda metafactory method)。
         */
        System.out.println(x1.getName());
        System.out.println(x2.getName());


        System.out.println(x1);
        System.out.println(x2);

    }

    static X makeX() {
        return () -> {
            System.out.println("X");
        };
    }

    static class Device {
    }

    static class DeviceA extends Device implements SwitchableMixin {
    }

    static class DeviceB extends Device implements SwitchableMixin {
    }
}

